/**
 * @file Interpolator.h
 * @brief 插值器类的声明
 * 
 * 提供了高性能的空间插值算法，包括：
 * 1. 反距离权重(IDW)插值
 * 2. 基于八象限的空间分布检查
 * 3. SIMD优化的数值计算
 * 4. 自适应插值策略
 */

#pragma once
#include <vector>
#include "KDTree.h"

class Interpolator
{
public:
    /**
     * @brief 构造函数
     * @param tree KD树引用
     */
    explicit Interpolator(const KDTree& tree) : kdtree(tree) {}

    /**
     * @brief 计算目标点的插值结果
     * @param target 目标点坐标
     * @param neighbors K个最近邻点及其距离
     * @return 返回插值计算的S1值
     * 
     * 插值策略：
     * 1. 检查是否有重合点
     * 2. 根据空间分布选择插值方法
     * 3. 执行插值计算
     */
    double calculate(
        const Point3D &target,
        const std::vector<std::pair<double, KDTree::KDNode *>> &neighbors);

private:
    const KDTree& kdtree;  ///< KD树引用，用于空间搜索

    /**
     * @brief 执行反距离权重插值计算
     * @param target 目标点坐标
     * @param neighbors K个最近邻点及其距离
     * @return 返回IDW插值结果
     * 
     * 计算步骤：
     * 1. 计算权重
     * 2. 加权平均
     * 3. SIMD优化
     */
    double calculateIDW(
        const Point3D &target,
        const std::vector<std::pair<double, KDTree::KDNode *>> &neighbors);

    /**
     * @brief 检查数据点的空间分布
     * @param neighbors K个最近邻点及其距离
     * @return 如果八个象限都有点则返回true
     * 
     * 检查步骤：
     * 1. 计算中心点
     * 2. 判断每个点所在象限
     * 3. 检查象限覆盖情况
     */
    bool checkOctantCoverage(
        const std::vector<std::pair<double, KDTree::KDNode *>> &neighbors);

    /**
     * @brief 计算三线性插值
     * @param target 目标点坐标
     * @param octant_points 八个象限的点
     * @return 返回三线性插值结果
     * 
     * 执行三线性插值计算：
     * 1. 计算归一化坐标
     * 2. 计算插值权重
     * 3. SIMD优化的数值计算
     */
    double calculateTrilinearInterpolation(
        const Point3D &target,
        const std::vector<std::pair<double, KDTree::KDNode *>> &octant_points);
}; 